home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1996 March / macformat-035.iso / Shareware City / Developers / ICAppSourceKit1.2 / ICText.p < prev    next >
Encoding:
Text File  |  1995-11-07  |  5.8 KB  |  263 lines  |  [TEXT/CWIE]

  1. unit ICText;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Dialogs;
  7.         
  8.     function TextCreate (var data: univ ptr; window: DialogPtr; item: integer; font: integer; size: integer; locked: boolean): OSErr;
  9.     procedure TextDestroy (var data: univ ptr);
  10.     procedure TextDraw (data: univ ptr);
  11.     procedure TextActivate (data: univ ptr; activate: boolean);
  12.     procedure TextClick (data: univ ptr; er: eventRecord);
  13.     procedure TextIdle (data: univ ptr);
  14.     procedure TextKey (data: univ ptr; er: EventRecord);
  15.     procedure TextSetSelect (data: univ ptr; selStart, selEnd: integer);
  16.     procedure TextGetSelect (data: univ ptr; var selStart, selEnd: integer);
  17.     procedure TextGetSize (data: univ ptr; var text_size: longint);
  18.     procedure TextInsert (data: univ ptr; h: Handle);
  19.     procedure TextGet (data: univ ptr; h: Handle);
  20.     procedure TextMove (data: univ ptr; r: Rect);
  21.  
  22.     procedure TextCut (data: univ ptr);
  23.     procedure TextCopy (data: univ ptr);
  24.     procedure TextPaste (data: univ ptr);
  25.     procedure TextClear (data: univ ptr);
  26.  
  27.     procedure NopCaretHook; { asm }
  28.  
  29. implementation
  30.  
  31.     uses
  32.         ICDialogs, Scrap;
  33.  
  34.     type
  35.         ItemData = record
  36.                 window: DialogPtr;
  37.                 item: integer;
  38.                 te: TEHandle;
  39.                 fi: FontInfo;
  40.                 lineheight: integer;
  41.                 active: boolean;
  42.             end;
  43.         ItemDataPtr = ^ItemData;
  44.  
  45.     function TextCreate (var data: univ ptr; window: DialogPtr; item: integer; font: integer; size: integer; locked: boolean): OSErr;
  46.         var
  47.             err: OSErr;
  48.             idp: ItemDataPtr;
  49.             view, dest: rect;
  50.             saved: SavedWindowInfo;
  51.     begin
  52.         data := NewPtr(SizeOf(ItemData));
  53.         err := MemError;
  54.         if err = noErr then begin
  55.             idp := ItemDataPtr(data);
  56.             idp^.window := window;
  57.             idp^.item := item;
  58.             idp^.te := nil;
  59.             idp^.active := true;
  60.             EnterWindow(window, font, size, [], saved);
  61.             with idp^ do begin
  62.                 GetDItemRect(window, item, dest);
  63.                 view := dest;
  64.                 GetFontInfo(fi);
  65.                 lineheight := fi.leading + fi.ascent + fi.descent;
  66.                 dest.bottom := dest.top + (dest.bottom - dest.top) div lineheight * lineheight;
  67.                 te := TENew(dest, view);
  68.                 if locked then begin
  69.                     te^^.caretHook := @NopCaretHook; { Disable the caret }
  70.                 end;
  71.                 TEAutoView(true, te);
  72.             end;
  73.             ExitWindow(saved);
  74.             if err <> nOErr then begin
  75.                 TextDestroy(data);
  76.             end;
  77.         end;
  78.         TextCreate := err;
  79.     end;
  80.  
  81.     procedure TextDestroy (var data: univ ptr);
  82.         var
  83.             idp: ItemDataPtr;
  84.     begin
  85.         idp := ItemDataPtr(data);
  86.         if data <> nil then begin
  87.             if idp^.te <> nil then begin
  88.                 TEDispose(idp^.te);
  89.             end;
  90.             DisposePtr(data);
  91.             data := nil;
  92.         end;
  93.     end;
  94.  
  95.     procedure TextDraw (data: univ ptr);
  96.         var
  97.             idp: ItemDataPtr;
  98.             r: rect;
  99.     begin
  100.         idp := ItemDataPtr(data);
  101.         GetDItemRect(idp^.window, idp^.item, r);
  102.         EraseRect(r);
  103.         TEUpdate(idp^.te^^.viewRect, idp^.te);
  104.     end;
  105.  
  106.     procedure TextActivate (data: univ ptr; activate: boolean);
  107.         var
  108.             idp: ItemDataPtr;
  109.     begin
  110.         idp := ItemDataPtr(data);
  111.         idp^.active := activate;
  112.         if idp^.active then begin
  113.             TEActivate(idp^.te);
  114.         end else begin
  115.             TEDeactivate(idp^.te);
  116.         end;
  117.     end;
  118.  
  119.     procedure TextClick (data: univ ptr; er: EventRecord);
  120.         var
  121.             idp: ItemDataPtr;
  122.             control: controlHandle;
  123.             part: integer;
  124.     begin
  125.         idp := ItemDataPtr(data);
  126.         with idp^ do begin
  127.             SetPort(window);
  128.             GlobalToLocal(er.where);
  129.             part := FindControl(er.where, window, control);
  130.             if part = 0 then begin
  131.                 if PtInRect(er.where, te^^.viewRect) then begin
  132.                     TEClick(er.where, BAND(er.modifiers, shiftKey) <> 0, te);
  133.                 end;
  134.             end else begin
  135.             end;
  136.         end;
  137.     end;
  138.  
  139.     procedure TextIdle (data: univ ptr);
  140.         var
  141.             idp: ItemDataPtr;
  142.     begin
  143.         idp := ItemDataPtr(data);
  144.         TEIdle(idp^.te);
  145.     end;
  146.  
  147.     procedure TextKey (data: univ ptr; er: EventRecord);
  148.         var
  149.             idp: ItemDataPtr;
  150.     begin
  151.         idp := ItemDataPtr(data);
  152.         if BAND(er.modifiers, cmdKey) = 0 then begin
  153.             TEKey(chr(BAND(er.message, $FF)), idp^.te);
  154.         end;
  155. {    Adjust;}
  156.     end;
  157.  
  158.     procedure TextSetSelect (data: univ ptr; selStart, selEnd: integer);
  159.         var
  160.             idp: ItemDataPtr;
  161.     begin
  162.         idp := ItemDataPtr(data);
  163.         TESetSelect(selStart, selEnd, idp^.te);
  164.     end; (* TextSetSelect *)
  165.  
  166.     procedure TextGetSelect (data: univ ptr; var selStart, selEnd: integer);
  167.         var
  168.             idp: ItemDataPtr;
  169.     begin
  170.         idp := ItemDataPtr(data);
  171.         selStart := idp^.te^^.selStart;
  172.         selEnd := idp^.te^^.selEnd;
  173.     end;
  174.  
  175.     procedure TextGetSize (data: univ ptr; var text_size: longint);
  176.         var
  177.             idp: ItemDataPtr;
  178.     begin
  179.         idp := ItemDataPtr(data);
  180.         text_size := GetHandleSize(idp^.te^^.hText);
  181.     end;
  182.  
  183.     procedure TextInsert (data: univ ptr; h: Handle);
  184.         var
  185.             idp: ItemDataPtr;
  186.             s: signedByte;
  187.     begin
  188.         idp := ItemDataPtr(data);
  189.         s := HGetState(h);
  190.         HLock(h);
  191.         TEInsert(h^, GetHandleSize(h), idp^.te);
  192.         HSetState(h, s);
  193.     end; (* TextInsert *)
  194.  
  195.     procedure TextGet (data: univ ptr; h: Handle);
  196.         var
  197.             idp: ItemDataPtr;
  198.             source_size: longint;
  199.             source: Handle;
  200.     begin
  201.         idp := ItemDataPtr(data);
  202.         source := Handle(TEGetText(idp^.te));
  203.         source_size := GetHandleSize(source);
  204.         SetHandleSize(h, source_size);
  205.         if MemError = noErr then begin
  206.             BlockMove(source^, h^, source_size);
  207.         end else begin
  208.             SetHandleSize(h, 0);
  209.         end; (* if *)
  210.     end; (* TextGet *)
  211.  
  212.     procedure TextMove (data: univ ptr; r: Rect);
  213.         var
  214.             idp: ItemDataPtr;
  215.     begin
  216.         idp := ItemDataPtr(data);
  217.         idp^.te^^.viewRect := r;
  218.         idp^.te^^.destRect := r;
  219.         TECalText(idp^.te);
  220.     end;
  221.  
  222.     procedure TextCut (data: univ ptr);
  223.         var
  224.             idp: ItemDataPtr;
  225.             junk: longint;
  226.     begin
  227.         idp := ItemDataPtr(data);
  228.         TECut(idp^.te);
  229.         junk := ZeroScrap;
  230.         junk := TEToScrap;
  231.     end;
  232.  
  233.     procedure TextCopy (data: univ ptr);
  234.         var
  235.             idp: ItemDataPtr;
  236.             junk: longint;
  237.     begin
  238.         idp := ItemDataPtr(data);
  239.         TECopy(idp^.te);
  240.         junk := ZeroScrap;
  241.         junk := TEToScrap;
  242.     end;
  243.  
  244.     procedure TextPaste (data: univ ptr);
  245.         var
  246.             idp: ItemDataPtr;
  247.     begin
  248.         idp := ItemDataPtr(data);
  249.         if TEFromScrap = noErr then begin
  250.             TEPaste(idp^.te);
  251.         end; (* if *)
  252.     end;
  253.  
  254.     procedure TextClear (data: univ ptr);
  255.         var
  256.             idp: ItemDataPtr;
  257.     begin
  258.         idp := ItemDataPtr(data);
  259.         TEDelete(idp^.te);
  260.     end;
  261.  
  262. end.
  263.